package com.itheima.reggie.controller;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.itheima.reggie.common.R;
import com.itheima.reggie.dto.DishDto;
import com.itheima.reggie.entity.Category;
import com.itheima.reggie.entity.Dish;
import com.itheima.reggie.entity.DishFlavor;
import com.itheima.reggie.service.CategoryService;
import com.itheima.reggie.service.DishFlavorService;
import com.itheima.reggie.service.DishService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.AutoConfigureOrder;
import org.springframework.web.bind.annotation.*;

import java.util.ArrayList;
import java.util.List;

@RestController
@Slf4j
@RequestMapping("/dish")
public class DishController {
    @Autowired
    private DishService dishService;

    @Autowired
    private CategoryService categoryService;

    @Autowired
    private DishFlavorService dishFlavorService;
//两个表关联添加
    @PostMapping
    public R<String> save(@RequestBody DishDto dishDto){
        log.info("添加操作"+dishDto);
        //dishDto的书籍需要往几个表里面加
        //往两个表 加数据是不是属于业务操作
        //业务是不是需要保存一个菜品 和多个口味
        //在DishService接口中自定义方法 快捷键alt+enter 快捷创建方法
        dishService.saveDishAndFlavor(dishDto);
        return R.success("添加菜品成功");
    }

    @GetMapping("/page")
    public R<Page> select(int page,int pageSize , String name){
        log.info("分页查询");
        //创建分页构造器  泛型是Dish实体类
        Page<Dish> page1 = new Page<>(page,pageSize);
        //创建条件构造器
        LambdaQueryWrapper<Dish> lambdaQueryWrapper = new LambdaQueryWrapper();
        //拼接sql条件  如果name是空就不拼接,不是空就拼接sql条件 "name"= name  eq方法是等于的意思
        lambdaQueryWrapper.like(StringUtils.isNotEmpty(name),Dish::getName,name);
        //隐藏规则 排序
        lambdaQueryWrapper.orderByDesc(Dish::getCreateTime);
        //先查出菜品分页信息
        dishService.page(page1, lambdaQueryWrapper);
        //这样查出来的数据没有,菜品数据没有菜品分类名称,需要在DishDto中加一个菜品分类名称属性来接收category的name属性
        Page<DishDto> dtoPage= new Page<>();
        //有一个方法可以cope,将page分页查询出来的结果cope到dtoPage中,不要当前页面数据,要就没有意义了
        //DishDto里面加 它不需要跟表对应,前段缺啥数据 我补啥
        //可以完成 对象属性的复制
        //BeanUtils.copyProperties(page1,dtoPage)
        //Page类中的records是来接收当前页数据的
        //这个可以把对象的属性进行复制   ,三个参数,把page1对象中的属性复制到dtoPage,那个属性不复制"records"
        BeanUtils.copyProperties(page1,dtoPage,"records");
        //现在dtoPag对象还缺一个records List集合
        //创建一个List集合
        List<DishDto> dtoList = new ArrayList<>();
        //获取page1中的records集合属性
        List<Dish> records = page1.getRecords();
        //遍历集合,获取每个Dish对象
        for (final Dish record : records) {
            //将每个Dish对象复制给DishDto对象里,在根据菜品对象中id去Category表中查name字段,赋值给DishDto属性里
            DishDto dishDto = new DishDto();
            //用BeanUtils.copyProperties方法可以将对象中的属性进行copy复制到另一个对象中,可以选择不copy复制那个属性,
            //后面加那个属性名eanUtils.copyProperties(record,dishDto,"不copy的属性名");
            BeanUtils.copyProperties(record,dishDto);
            //根据id 查询
            Category byId = categoryService.getById(record.getCategoryId());
            //查询出来的是Category对象,就要这个对象中的name属性
            dishDto.setCategoryName(byId.getName());
            //把dishDto对象存到dtoList集合里
            dtoList.add(dishDto);
        }
        //Page<DishDto> dtoPage= new Page<>(); 这个对象里还缺少一个当前页面数据是List集合类型的
        dtoPage.setRecords(dtoList);
        //返回给前段数据
        return R.success(dtoPage);
    }
    @GetMapping("/{id}") //url地址 restfull 风格
        public R<DishDto> getById(@PathVariable Long id){
        DishDto dishAndFlavor = dishService.getDishAndFlavor(id);
        return R.success(dishAndFlavor);
    }
    @PutMapping() //url地址 restfull 风格
    public R<String> update(@RequestBody DishDto dishDto){
        dishService.updateDishAndDishFlavor(dishDto);

        return R.success("修改成功");
    }
//    @GetMapping("/list")
//    public R<List<Dish>> getById2(Dish dish){
//        LambdaQueryWrapper<Dish>wrapper = new LambdaQueryWrapper<>();
//        wrapper.eq(dish.getCategoryId()!=null,Dish::getCategoryId,dish.getCategoryId());
//        List<Dish> list = dishService.list(wrapper);
//        return  R.success(list);
//    }
    @GetMapping("/list")
    public R<List<DishDto>> list(Dish dish){
        //构建查询条件
        LambdaQueryWrapper<Dish> wrapper = new LambdaQueryWrapper<>();
        //加条件
        wrapper.eq(dish.getCategoryId()!=null,Dish::getCategoryId,dish.getCategoryId());
        // 套餐里面加停售的还是启售的   启售的  status 是1 的
        wrapper.eq(Dish::getStatus,1);
        //你想排就排  --- 有排序字段  没有就按照 更新日期倒序
        wrapper.orderByDesc(Dish::getUpdateTime);
        List<Dish> list = dishService.list(wrapper);

        // 返回 List<DishDto>
        //  把 每一个dish---DishDto  dishDto 根据 菜品id查询到 对应的 口味信息
        //封装到 sishDto的 flavors  属性中
        List<DishDto>  dishDtoList = new ArrayList<>();
        for (Dish dish1 : list) {
            DishDto dishDto = new DishDto();
            BeanUtils.copyProperties(dish1,dishDto);
            // 根据拿到的 dishid 去查询相关的  口味信息
            Long dishId = dish1.getId();
            LambdaQueryWrapper<DishFlavor> wrapper1 = new LambdaQueryWrapper<>();
            wrapper1.eq(DishFlavor::getDishId,dishId);
            List<DishFlavor> flavors = dishFlavorService.list(wrapper1);
            dishDto.setFlavors(flavors);
            Category category = categoryService.getById(dish.getCategoryId());
            dishDto.setCategoryName(category.getName());

            dishDtoList.add(dishDto);
        }


        return R.success(dishDtoList);
    }
}
